#ifndef NODE_CHANNEL
#define NODE_CHANNEL
#include <functional>
#include <memory>
#include <string.h>
#include <unordered_map>
#include <node.h>
#include <uv.h>
#include <iostream>

#include "utils/queue.h"
#include "utils/hlog.h"

namespace privacy_service
{
using PersistentPtr = std::shared_ptr<v8::Global<v8::Function> >;
class NodeChannel
{
public:

	NodeChannel();
	void buildConnect();
	void removeConnect();
	bool callMainThread(std::string data, PersistentPtr cb);
	
private:
	/*
	* 此方法会在node主线程调用，以读取responseDatas_中的所有数据
	* 注：uv_async_t有可能连续发送多次通知，而此回调函数只调用一次，
	* 因此每次调用时，需要读取responseDatas_里的所有数据。
	*/
	static void asyncCb(uv_async_t* handle);
	static void closeCb(uv_handle_t* handle);		//关闭uv_async_t时调用


	/*
	*   服务器返回数据不在node主线程，需要封装成此结构放入队列中，
	*	然后通过uv_async_t通知node主线程取得此数据。
	*/
	struct ResponseData
	{
		~ResponseData()
		{
		}

		std::string info;
		PersistentPtr cb;
	};

	Queue responseDatas_;
	uv_async_t async_;
};
} /*namespace privacy_service*/
#endif
